#include<iostream>
using namespace std;

/**
 * cpp的常量
 * */

int main() {
    const int i = 10;

    //常量是不可修改的，编译器会阻止修改const修饰的变量，但是但是？？？看后面
    //i = 20;
    //这里试图修改常量i的值，编译器会输出错误信息：
    //main.cpp:10: error: assignment of read-only variable `i'

    cout << i << endl;
    //输出 10

    /**
     * 这里我们通过指针修改const修饰的变量i的值？     
     * */
    
    //这里的&i得到的是const int*, pi是int*，需要强制转换下，
    //const修饰的不同后面单独讲，const int*, const *int的不同？
    //int* pi = &i;
    int* pi = (int*)&i;
    *pi = 20;

    //下面两个地址一样，说明都是同一块内存区域    
    //0x28cd34
    //0x28cd34
    cout << &i << endl; 
    cout << pi << endl;

    //但下面的输出却不一致，
    cout << *pi << endl;    //20，
    cout << i << endl;      //10
    //这个不是修改内存不起作用，而是编译器优化造成的，了解下编译器的常量折叠优化原理！类似于宏定义了，直接替换，不再访问内存导致输出不一致！
    //需要了解下《编译原理》这本书

    return 0;
}

/**
 * 程序输出：
 *  10
    0x28cd34
    0x28cd34
    20
    10
 * */
